from typing import Generic, TypeVar, Optional
from pydantic import BaseModel
import time

T = TypeVar('T')


# 常量定义（模拟 Java 中的 CommonConstant）
class CommonConstant:
    SC_OK_200 = 200
    SC_INTERNAL_SERVER_ERROR_500 = 500
    SC_NO_AUTHZ = 401  # 无权限访问


class Result(Generic[T], BaseModel):
    """
    通用返回结构，对应 Java 版本：
    - success: 成功标志（bool）
    - message: 返回消息（str）
    - code: 状态码（int）
    - result: 数据体（泛型 T）
    - timestamp: 时间戳（毫秒级）
    """
    success: bool = True
    message: str = ""
    code: int = CommonConstant.SC_OK_200
    result: Optional[T] = None
    timestamp: int = int(time.time() * 1000)  # 转换为毫秒时间戳

    @classmethod
    def ok(cls, message: str = "", result: Optional[T] = None) -> "Result":
        return cls(
            success=True,
            message=message,
            code=CommonConstant.SC_OK_200,
            result=result,
            timestamp=int(time.time() * 1000)
        )

    @classmethod
    def OK(cls, *args, **kwargs) -> "Result":
        """
        兼容 Java 中的多个重载版本：
        - OK()
        - OK(data)
        - OK(message)
        - OK(message, data)
        """
        if len(args) == 0:
            return cls.ok()
        elif len(args) == 1:
            if isinstance(args[0], str):
                return cls.ok(message=args[0])
            else:
                return cls.ok(result=args[0])
        elif len(args) == 2:
            return cls.ok(message=args[0], result=args[1])
        else:
            raise TypeError("OK() 只接受 0~2 个参数")

    @classmethod
    def error(cls, *args, **kwargs) -> "Result":
        """
        支持两种调用形式：
        - error(message)
        - error(code, message)
        """
        if len(args) == 1:
            return cls(
                success=False,
                message=args[0],
                code=CommonConstant.SC_INTERNAL_SERVER_ERROR_500,
                timestamp=int(time.time() * 1000)
            )
        elif len(args) == 2:
            return cls(
                success=False,
                message=args[1],
                code=args[0],
                timestamp=int(time.time() * 1000)
            )
        else:
            raise TypeError("error() 只接受 1 或 2 个参数")

    @classmethod
    def oauth(cls, message: str = "") -> "Result":
        return cls(
            success=False,
            message=message,
            code=CommonConstant.SC_NO_AUTHZ,
            timestamp=int(time.time() * 1000)
        )

    @classmethod
    def error500(cls, message: str) -> "Result":
        return cls(
            success=False,
            message=message,
            code=CommonConstant.SC_INTERNAL_SERVER_ERROR_500,
            timestamp=int(time.time() * 1000)
        )
